package com.congwulin.wechat.util.service.vo;

import com.congwulin.wechat.entity.common.SuperVO;
import com.congwulin.wechat.util.SpringUtil;
import com.congwulin.wechat.util.UserInfoUtil;
import com.congwulin.wechat.util.interfaces.IVOPersistent;

import java.sql.Date;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class VOPersistent {
    /**
     * 实体保存数据库器
     */
    private IVOPersistent dao;

    /**
     * 实体数据库保存构造函数
     *
     * @param dao
     *            实体保存数据库器
     */
    public VOPersistent(IVOPersistent dao) {
        this.dao = dao;
    }

    /**
     * 根据主键列表删除实体
     *
     * @param list
     *            主键列表
     */
    public void delete(List<SuperVO> list) {
        // 设置时间戳
        this.setTs(list);

        List<String> idList = new ArrayList<String>();
        for (SuperVO vo : list) {
            String id = vo.getId();
            idList.add(id);
        }
        this.dao.delete(idList);
    }

    /**
     * 将新增实体插入到数据库中
     *
     * @param list
     *            新增实体
     * @return 保存后的实体
     */
    public List<SuperVO> insert(List<SuperVO> list) {
        // 设置时间戳
        this.setTs(list);
        // set dr = 0
        this.setDr(list);

        this.setNewAuditInfo(list);

        this.dao.insert(list);
        return list;
    }

    /**
     * 将新增实体插入到数据库中(生成ID)
     *
     * @param list
     *            新增实体
     * @return 保存后的实体
     */
    public List<SuperVO> insertWithID(List<SuperVO> list) {
        //设置ID
        this.setIDAndFK(list);
        // 设置时间戳
        this.setTs(list);
        // set dr = 0
        this.setDr(list);

        this.setNewAuditInfo(list);

        this.dao.insert(list);
        return list;
    }

    /**
     * 将修改实体保存到数据库中
     *
     * @param list
     *            修改的实体
     * @return 保存后的实体
     */
    public List<SuperVO> update(List<SuperVO> list) {
        // 设置时间戳
        this.setTs(list);

        this.setUpdateAuditInfo(list);

        this.dao.update(list);
        return list;
    }

    private void setTs(List<SuperVO> list) {
        Timestamp ts = new Timestamp(System.currentTimeMillis());
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println( format.format(new Date(ts.getTime())));
        for (SuperVO vo : list) {
            vo.setTs(ts);
        }
    }

    /**
     * 设置默认dr=0
     *
     * @param list
     */
    private void setDr(List<SuperVO> list) {
        for (SuperVO vo : list) {
            vo.setDr(0);
        }
    }

    /**
     * 设置创建人创建时间，包括表头表体
     *
     * @param list
     */
    private void setNewAuditInfo(List<SuperVO> list) {
        // 创建时间
        Timestamp creationtime = new Timestamp(System.currentTimeMillis());
        // 创建人
        UserInfoUtil util = SpringUtil.getBean(UserInfoUtil.class);
        String creator = util.getContent().getId();
        String creatorname = util.getContent().getName();

        for (SuperVO vo : list) {
            vo.setCreationtime(creationtime);
            vo.setCreator(creator);
            vo.setCreator_name(creatorname);
        }

    }

    /**
     * 设置修改人修改时间
     * @param list
     */
    private void setUpdateAuditInfo(List<SuperVO> list) {
        // 修改时间
        Timestamp modifiedtime = new Timestamp(System.currentTimeMillis());
        // 修改人
        UserInfoUtil util = SpringUtil.getBean(UserInfoUtil.class);
        String modifier = util.getContent().getId();
        String modifiername = util.getContent().getName();

        for (SuperVO vo : list) {
            vo.setModifiedtime(modifiedtime);
            vo.setModifier(modifier);
            vo.setModifier_name(modifiername);
        }

    }

    private void setIDAndFK(SuperVO vo) {
        //设置主实体主键
        String id = vo.getId();
        if (id == null) {
            id = UUID.randomUUID().toString().replaceAll("-", "");
        }
        vo.setId(id);
    }

    private void setIDAndFK(List<SuperVO> list) {
        for (SuperVO vo : list) {
            this.setIDAndFK(vo);
        }
    }
}
